'use strict';

const { Service } = require('egg');
const ModelName = 'Diagnosis'
const { getColorFromURL } = require('@delirius/color-thief-node');
const dayjs = require('dayjs');
class RouterService extends Service {
  /**
   * 根据分页和搜索条件获取
   * @param {Object} where 搜索条件
   * @param {Number} page 当前分页
   * @param {Number} pageSize 当前页每页多少条
   */
  async getPage(where, page, pageSize) {
    return this.ctx.model[ModelName].findAndCountAll({
      where,
      offset: pageSize * (page - 1),
      limit: pageSize,
      order:[
        // id 降序
        ['create_time','DESC']
      ],
      include: [
        {
          model: this.ctx.model.User,
        },
        {
            model: this.ctx.model.Color,
        }
      ]
    });
  }

  // 所有列表
  async allList(where) {
    return this.ctx.model[ModelName].findAll({
        where,
      order:[
        // id 降序
        ['create_time','DESC']
      ],
        include: [
            {
                model: this.ctx.model.User,
            },
            {
                model: this.ctx.model.Color,
            }
        ]
    });
  }
  async findOne(id) {
    return this.ctx.model[ModelName].findOne({
      where: {
        id,
      },
        include: [
            {
                model: this.ctx.model.User,
            },
            {
                model: this.ctx.model.Color,
            }
        ]
    });
  }

  /**
   * 创建
   * @param {*} data 创建的数据
   */
  async create(data) {
    // 读取本地图片颜色
    const image = this.ctx.request.origin + data.image; // 图片地址为path
    const colorPallete = await getColorFromURL(image);
    if (!colorPallete || colorPallete.length !== 3) throw new Error('获取图片颜色失败');
    /**
     * 1. **红色**：
     *    - 热毒炽盛：舌质红绛，苔黄干燥，常见于高热、炎症等。
     *    - 血热：舌质红赤，苔黄干燥，常见于出血、高热、感染等。
     *    - 阳亢：舌质红绛，苔少或无，常见于阳亢引起的症状如高热、心烦等。
     *
     * 2. **淡红色**：
     *    - 脾胃虚弱：舌质淡红，苔白腻，常见于消化不良、食欲不振等。
     *
     * 3. **紫色**：
     *    - 淤血：舌质发绀或紫暗，常见于心脏病、肝脾疾病等。
     *    - 寒湿凝滞：舌质紫暗，苔白腻，常见于寒湿邪气所致的症状如关节疼痛、肢体酸重等。
     *
     * 4. **白色**：
     *    - 气虚：舌质淡白，苔白腻，常见于气虚引起的症状如乏力、气短等。
     *    - 阴虚：舌质淡白，苔少或无，常见于阴虚引起的症状如口干、口燥等。
     *
     * 5. **青色**：
     *    - 寒凝：舌质青紫，苔白厚腻，常见于寒邪内盛引起的症状如胸胁疼痛、关节拘急等。
     * 健康为粉红色
     */
    const colorName = {
        1: '红色',
        2: '绿色',
        3: '蓝色',
        4: '黄色',
        5: '青色',
        6: '紫色',
        7: '白色',
        8: '黑色',
        0: '其他'
    }
    const insertData = {
      ...data,
      image: data.image,
      color:`rgb(${colorPallete[0]}, ${colorPallete[1]}, ${colorPallete[2]})`,
      colorType: '0'
    }

      function getColorRange(r, g, b) {
          const colorConfig = [
              { name: "红色", type: "1", condition: (r, g, b) => r > 200 && g < 100 && b < 100 },
              { name: "淡红色", type: "2", condition: (r, g, b) => r > 200 && g > 100 && b > 100 },
              { name: "紫色", type: "3", condition: (r, g, b) => r > 150 && g < 100 && b > 150 },
              { name: "白色", type: "4", condition: (r, g, b) => r > 200 && g > 200 && b > 200 },
              { name: "青色", type: "5", condition: (r, g, b) => r < 100 && g > 150 && b > 150 },
              { name: "粉红色", type: "6", condition: (r, g, b) => r > 200 && g < 100 && b > 200 }
          ];

          const color = colorConfig.find(c => c.condition(r, g, b));

          return color ? color : { name: "其他", type: "0" };
      }
      insertData.colorType = getColorRange(colorPallete[0], colorPallete[1], colorPallete[2]).type;

    const colorList = await this.ctx.model.Color.findAll({
      where: {
        type: insertData.colorType
      },
      // 降序 从大到小
        order:[
            ['create_time','DESC']
        ],
    });
    if (colorList.length > 0) {
        insertData.color_id = colorList[0].id;
        insertData.color = colorList[0]
    } else {
        const colorData = {
            name: colorName[insertData.colorType],
            type: insertData.colorType
        }
        const color = await this.ctx.model.Color.create(colorData);
        insertData.color_id = color.id;
        insertData.color = color
    }
      const result = await this.ctx.model[ModelName].create(insertData);
    return {
        ...result.dataValues,
        create_time: dayjs(result.dataValues.create_time).format('YYYY-MM-DD HH:mm:ss'),
        ...insertData
    };
  }

  /**
   * 根据ID修改
   * @param {Number} id ID
   * @param {Object} data 要修改的信息
   */
  async update(id, data) {
    return await this.ctx.model[ModelName].update(data, { where: { id } });
  }

  /**
   * 根据id删除
   * @param {Number} id ID
   */
  async deleteById(id) {
    return await this.ctx.model[ModelName].destroy({ where: { id } });
  }
}

module.exports = RouterService;
